package cn.mujiankeji.mbrowser.界面.组件.配置列表

import androidx.compose.foundation.layout.RowScope
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import 操作.工具类.时间操作
import 数据.枚举类.错误类型


abstract class 配置项 {
    open var 名称 by mutableStateOf("")
    open var 内容 by mutableStateOf("")

    fun 更新名称(name : String){
        this.名称 = name
    }
    fun 更新内容(value : String){
        this.内容 = value
    }

    class 项目(标题 : String,副标题 : String = "",val clickable : ()->Unit) : 配置项() {

        init {
            this.名称 = 标题
            this.内容 = 副标题
        }
    }

    /**
     * @param 菜单视图 菜单实现
     */
    class 选项(
        name : String = "",
        value : String = "",
        val 菜单视图 : @Composable (()->Unit)->Unit
    ) : 配置项()
    {
        init {
            super.名称 = name
            super.内容 = value
        }
    }

    /**
     * 适合小文本
     * @param onChange 改变值 , 返回空则无错误提示，否则界面应显示含错误提示。
     */
    class 编辑框(
        name : String,
        value : String = "",
        val onChange : suspend (String)-> 错误类型?,
    ) : 配置项()
    {

        var value by mutableStateOf("")
        init {
            this.名称 = name
            this.value = value
        }

    }

    /**
     * 时间选择配置项
     * @param name 配置项名称
     * @param value 时间戳 - 秒
     * @param onChange 改变值回调
     */
    class 时间(
        name: String,
        times: Long = 0,
        val onChange: suspend (Long) -> 错误类型?
    ) : 配置项()
    {
        init {
            super.名称 = name
            super.内容 = 时间操作.时间戳到文本(times)
        }
    }

    /**
     * 开关配置项
     * @param name 配置项名称
     * @param value 开关状态
     * @param onChange 改变值回调
     */
    class 开关(
        name: String,
        sel: Boolean = false,
        val onChange: (Boolean) -> Unit
    ) : 配置项() {
        var 选中状态 by mutableStateOf(sel)
    }

    class 提示(name : String) : 配置项(){
        init {
            super.名称 = name
        }
    }

    /**
     * 一般用于自定义行
     */
    class 行(name : String, val content : @Composable RowScope.()->Unit) : 配置项(){
        init {
            super.名称 = name
        }
    }
}

class 配置组(name : String ?= null, items: List<配置项> = ArrayList()){
    var 标题 : String ?= name
    var 配置项列表 = mutableStateListOf<配置项>()
    init {
        配置项列表.addAll(items)
    }
}